/*
190. 颠倒二进制位
颠倒给定的32位无符号整数的二进制位。

例如，给定输入 43261596（二进制表示为 00000010100101000001111010011100 ），返回 964176192（二进制表示为 00111001011110000010100101000000）。

问题进阶:
如果多次调用这个函数，你将如何优化它？
*/

class Solution
{
public:
    uint32_t reverseBits(uint32_t n)
    {
        const uint32_t reverseMap[16] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15};
        return reverseMap[(n >> 28) & 15] |
               (reverseMap[(n >> 24) & 15] << 4) |
               (reverseMap[(n >> 20) & 15] << 8) |
               (reverseMap[(n >> 16) & 15] << 12) |
               (reverseMap[(n >> 12) & 15] << 16) |
               (reverseMap[(n >> 8) & 15] << 20) |
               (reverseMap[(n >> 4) & 15] << 24) |
               reverseMap[n & 15] << 28;
    }
};